package com.ostrich.a2104gao5

import java.io.File

/**
 * @Author : yaotianxue
 * @Time : On 2023/10/14 10:58
 * @Description : Test9
（1）标准库函数:所有的对象均可调用，泛型扩展函数
 (2)这些函数都在Standard.kt文件中 ：Standard标准

apply:返回类型是调用者本身+匿名函数中持有的是this==对象本身
let:返回类型是匿名函数的最后一行+匿名函数中持有的it==对象本身
run:返回类型是匿名函数的最后一行+匿名函数中持有的this==对象本身
with(str): with个run基本一样，使用方式不同.返回类型是匿名函数的最后一行+匿名函数中持有的this==对象本身
also:返回类型是调用者本身+匿名函数中持有的it==对象本身
takeIf :true执行后面
takeUnless :false执行后面

 面试题：
 （1）你用过哪些标准库函数，在哪里应用的？
 （2）takeIf和takeUnless区别？
 （3）let和apply的区别？
 （4）run和also的区别？
 （5）with和run的区别？with是run的变体

 */
fun main(){
    /******takeIf和takeUnless*****/
    val result = "yaotianxue".capitalize()
    //首字母转大写之前，判断字符串包含yao且长度大于6
    val result2 = "yaotianxue"
        //takeIf是true才会执行后面的操作 takeUnless是false才会执行后面操作
        .takeUnless {
            it.length > 16 && it.contains("yao")
        }
        ?.capitalize()
        ?: "默认值"
    println(result2)
    /******apply******/
    //以前写法
    val file = File("")
    file.setWritable(true)
    file.setReadable(true)
    file.setExecutable(true)
    //针对无法链式编程的代码可以用apply
    val file2 = File("").apply {
        setWritable(true)
        setReadable(true)
        setExecutable(true)

    }
    /******let：求一个集合中第一个元素后的平方*******/
    //不用let函数
    val  num1 = listOf(3,2,1).first()
    val result1 = num1 * num1
    println(result1)
    //用let函数:节省变量的声明
    val result22 = listOf(3,2,1).first().let{
            it * it

    }
    println(result22)
    /***also*******/
    val str22 = "yaotianxue"
    val result33 = str22.also {
        println("用户名为：$str22")
    }.also {
        println("用户名转大写 ${str22.capitalize()}")
    }
    println(result33)

    /***run**/
    val str33 = "yaotianxue"
    val result44 = str33.run {
        str33.length
    }
    println(result44)

    //使用run多个函数调用
//    val long = isLong(str33)
//    val show = show(long)
//    println(show)
    val result55 = str33.run(::isLong)
        .run(::show)//将isLong方法的返回数据作为参数传递给show方法
    println(result55)
    /**with：是run方法的变体**/
    val  result66 = with(str33,::isLong)
    println(result66)



}

fun isLong(name:String):Boolean{
    return name.length > 10
}

fun show(isLong:Boolean):String{
    return if(isLong) "太长了" else "太短了"
}
